//----------------------------------------------------------------------
//Copyright (C) 2016-2026 烟台东方威思顿电气股份有限公司电表软件研发部 
//创建人	胡春华
//创建日期	2016.8.11
//描述		公共函数接口文件
//修改记录	
//----------------------------------------------------------------------
#ifndef __COMMFUNC_API_H
#define __COMMFUNC_API_H
#include <rtdbg.h>
#include <rtthread.h>
//-----------------------------------------------
//				宏定义
//-----------------------------------------------
#define MAX_FLASH_BUF		128
/**********************************************数据定义********************************************************/
#define BYTE	                    unsigned char     
#define WORD	                    unsigned short
#define SWORD	                    short
#define DWORD	                    unsigned long
#define DDWORD	                    unsigned long long
#define BOOL	                    unsigned char
#define QWORD	                    unsigned long long
#define SQWORD	                    long long

#define FALSE                       0
#define TRUE                        1

#define UN_REPAIR_CRC		        0		          //不修复CRC
#define REPAIR_CRC			        1		          //修复CRC
//-----------------------------------------------
//				结构体，共用体，枚举
//-----------------------------------------------
typedef union TTwoByteUnion_t
{
	// 字方式 
	WORD w;
	// 字节方式 
	BYTE  b[2];
	// 有符号字
	SWORD sw;

}TTwoByteUnion;


typedef union TFourByteUnion_t
{
	// 双字方式 
	DWORD d;
	// 字方式 
	WORD w[2];
	// 字节方式 
	BYTE b[4];	
	// 带符号双字 
	long l;
	
}TFourByteUnion;

typedef union TEightByteUnion_t
{
	// 四字方式
	QWORD q;
	// 双字方式
	DWORD d[2];
	// 字方式
	WORD w[4];
	// 字节方式
	BYTE b[8];
	// 带符号四字
	long long ll;
}TEightByteUnion;

//-----------------------------------------------
//				变量声明
//-----------------------------------------------

//-----------------------------------------------
// 				函数声明
//-----------------------------------------------
//--------------------------------------------------
//功能描述:  把len个BufB的数据按位倒序给BufA  bit15~bit0  -> bit0~bit15  不翻转
//         
//参数:      BufA[out] 		输出数据的缓冲  可以输出缓冲指针一样
//         
//           BufB[in]		输入数据的缓冲
//         
//           Len[in]		数据长度
//         
//返回值:    
//         
//备注内容:  无
//--------------------------------------------------
void lib_ExchangeBitNOInverse(BYTE *BufA, BYTE *BufB, DWORD Len );


unsigned short CRC16( unsigned char *puchMsg, unsigned long usDataLen );
//-----------------------------------------------
//函数功能: 两个数组大小比较
//
//参数:		BufA[in]	输入数组A
//			BufB[in]	输入数组B
//			Len[in]		比较长度
//返回值: 	1:A>B; 2:A<B; 3:A=B
//		   
//备注:   	
//-----------------------------------------------
WORD lib_CmpData( BYTE *BufA, BYTE *BufB, WORD Len );
//-----------------------------------------------
//函数功能: 一个字节的BCD码数据转换为HEX码数据
//
//参数: 
//			Input[in]					要转换的数据
//                    
//返回值:  	转换后的HEX码数据
//
//备注:   
//-----------------------------------------------
BYTE lib_BBCDToBin(BYTE Input);
/*******************************************************************************
功能描述：	INT32U型HEX(BIN)数据转换为2~4字节BCD格式
输入参数：	*pDest:		目标数据指针
			*pSour:		源数据指针
			len:		转换字节数
返回参数：
函数说明：
*******************************************************************************/
void uLONG_nBCD(uint8_t *pDest, const uint8_t *pSour, uint8_t len);
//-----------------------------------------------
//函数功能: 多个字节的BCD码数据转换为HEX码数据
//
//参数: 
//          WORD Num                数据个数
//
//			pIn[in]					要转换的数据
//         
//          BYTE* pOut              输出的数据
//
//返回值:  	转换后的HEX码数据
//
//备注:   
//-----------------------------------------------
void lib_MultipleBBCDToBin( WORD Num, BYTE* pIn, BYTE* pOut );

//-----------------------------------------------
//函数功能: 一个字节的HEX码数据转换为BCD码数据
//
//参数: 
//			Input[in]					要转换的数据
//                    
//返回值:  	转换后的BCD码数据
//
//备注:   
//-----------------------------------------------
BYTE lib_BBinToBCD(BYTE Input);


//-----------------------------------------------
//函数功能: 一个WORD类型的BCD码数据转换为HEX码数据
//
//参数: 
//			Input[in]					要转换的数据
//                    
//返回值:  	转换后的HEX码数据
//
//备注:   
//-----------------------------------------------
WORD lib_WBCDToBin(WORD Input);


//-----------------------------------------------
//函数功能: 一个WORD类型的HEX码数据转换为BCD码数据
//
//参数: 
//			Input[in]					要转换的数据
//                    
//返回值:  	转换后的BCD码数据
//
//备注:   
//-----------------------------------------------
WORD lib_WBinToBCD(WORD Input);


//-----------------------------------------------
//函数功能: 一个DWORD类型的BCD码数据转换为HEX码数据
//
//参数: 
//			Input[in]					要转换的数据
//                    
//返回值:  	转换后的HEX码数据
//
//备注:   
//-----------------------------------------------
DWORD lib_DWBCDToBin(DWORD Input);


//-----------------------------------------------
//函数功能: 一个DWORD类型的HEX码数据转换为BCD码数据
//
//参数: 
//			Input[in]					要转换的数据
//                    
//返回值:  	转换后的BCD码数据
//
//备注:   
//-----------------------------------------------
DWORD lib_DWBinToBCD(DWORD Input);


//-----------------------------------------------
//函数功能: 一个SQWORD类型的BCD码数据转换为HEX码数据
//
//参数: 
//			Input[in]					要转换的数据
//                    
//返回值:  	转换后的HEX码数据
//
//备注:   
//-----------------------------------------------
SQWORD lib_QWBCDToBin( SQWORD Input );

//-----------------------------------------------
//函数功能: 多个字节的BCD码数据转换为HEX码数据
//
//参数: 
//          WORD Num                数据个数
//
//			pIn[in]					要转换的数据
//         
//          BYTE* pOut              输出的数据
//
//返回值:  	转换后的HEX码数据
//
//备注:   
//-----------------------------------------------
void lib_MultipleBBCDToBin( WORD Num, BYTE* pIn, BYTE* pOut );

//-----------------------------------------------
//函数功能: 多个字节的BCD码数据转换为HEX码数据
//
//参数: 
//          WORD Num                数据个数
//
//			pIn[in]					要转换的数据
//         
//          BYTE* pOut              输出的数据
//
//返回值:  	转换后的HEX码数据
//
//备注:   
//-----------------------------------------------
void lib_MultipleBBinToBCD( WORD Num, BYTE* pIn, BYTE* pOut );

//-----------------------------------------------
//函数功能: 一个SQWORD类型的HEX码数据转换为BCD码数据
//
//参数: 
//			Input[in]					要转换的数据
//                    
//返回值:  	转换后的BCD码数据
//
//备注:   
//-----------------------------------------------
SQWORD lib_QWBinToBCD( SQWORD Input );


//-----------------------------------------------
//函数功能: 计算10的n次幂的值
//
//参数: 
//			PowNum[in]			幂
//                    
//返回值:  	计算后的值
//
//备注:   没有判断范围，最大一个DWORD
//-----------------------------------------------
DWORD lib_MyPow10( BYTE PowNum );


//-----------------------------------------------
//函数功能: 检查一个字节的数据是否为BCD码
//
//参数: 
//			Input[in]					要判断的数据
//                    
//返回值:  	TRUE:数据符合BCD码		FALSE:数据不是BCD码
//
//备注:   
//-----------------------------------------------
BOOL lib_CheckBCD(BYTE Input);

//--------------------------------------------------
//函数功能:  字符串转HEX
//         
//参数:      无
//                 
//返回值:    无
//         
//备注:      无
//--------------------------------------------------
BOOL StringToHexGroup(unsigned char *OutHexBuffer, unsigned char *InStrBuffer, unsigned int strLength);
//-----------------------------------------------
//函数功能: 计算单字节累加和，超出一个字节的部分舍弃
//
//参数: 
//	ptr[in]:	输入缓冲
//
//	Length[in]:	缓冲长度
//                    
//返回值:	单字节累加和
//
//备注: 
//-----------------------------------------------
BYTE lib_CheckSum(BYTE * ptr, WORD Length);


//-----------------------------------------------
//函数功能: 计算CRC32校验
//
//参数: 
//	pBuf[in]:	输入缓冲
//
//	wSize[in]:	缓冲长度，不包括校验
//                    
//返回值:	CRC32校验
//
//备注: 
//-----------------------------------------------
DWORD lib_CheckCRC32( BYTE *pBuf, WORD wSize);

//-----------------------------------------------
//函数功能: 先检查缓冲中校验正确性，如果不正确，将计算的校验填充到校验区，校验固定认为是CRC32
//
//参数: 
//			p[in]				要计算校验的数据指针
//			Size[in]			缓冲存储数据大小，包括校验
//			Fix[in]				是否修复缓冲内的校验 0：不修复 1：修复
//                    
//返回值:  	TRUE:缓冲内的校验正确	FALSE:缓冲内的校验不正确
//
//备注:   
//-----------------------------------------------
BOOL lib_CheckSafeMemVerify( BYTE * p, WORD Size, WORD Fix );


//-----------------------------------------------
//函数功能: 数组成员翻转函数
//
//参数:		Buf[in]	输入数据
//			Len[in]	数据长度
//返回值: 	无
//		   
//备注:   	
//-----------------------------------------------
void lib_InverseData( BYTE *Buf, WORD Len );
//--------------------------------------------------
//函数功能:  HEX转ASCII
//         
//参数:      无
//                 
//返回值:    无
//         
//备注:      无
//--------------------------------------------------
void HexToAscii(unsigned char *pHexStr,unsigned char *pAscStr,int Len);
//--------------------------------------------------
//功能描述:  高位反转
//         
//参数:      
//         
//返回值:    
//         
//备注内容:  无
//--------------------------------------------------
unsigned char api_reverse(unsigned char x);

//--------------------------------------------------
//功能描述:  把BufB的数据倒序给BufA
//         
//参数:      BufA[out] 		输出数据的缓冲
//         
//           BufB[in]		输入数据的缓冲
//         
//           Len[in]		数据长度
//         
//返回值:    
//         
//备注内容:  无
//--------------------------------------------------
void lib_ExchangeData(BYTE *BufA, BYTE *BufB, BYTE Len );

//--------------------------------------------------
//功能描述:  把len个BufB的数据按位倒序给BufA  bit15~bit0  -> bit0~bit15
//         
//参数:      BufA[out] 		输出数据的缓冲  可以输出缓冲指针一样
//         
//           BufB[in]		输入数据的缓冲
//         
//           Len[in]		数据长度
//         
//返回值:    
//         
//备注内容:  无
//--------------------------------------------------
void lib_ExchangeBit(BYTE *BufA, BYTE *BufB, BYTE Len );
//--------------------------------------------------
//功能描述:  对指定字节数的两个数据进行异或
//         
//参数:      BYTE *BufA[in]  输入数据( 最后作为输出数据进行输出)
//         
//           BYTE *BufB[in]  输入数据
//         
//           BYTE Num[in]	   字节个数
//         
//返回值:    
//         
//备注内容:  无
//--------------------------------------------------
void lib_XorData( BYTE *BufA, BYTE *BufB, WORD Num );

//--------------------------------------------------
//函数功能: 判断指针p里面的数据是否都是AssignNum指定的数据
//
//参数:    P[in]       数据的缓冲
//			AssignNum[in] 要判断的指定数据
//         Length[in]  数据的长度
//
//返回值:TRUE、FALSE
//
//备注:
//--------------------------------------------------
BOOL lib_IsAllAssignNum( BYTE *p, BYTE AssignNum, WORD Length );

//--------------------------------------------------
//功能描述:  判断字节是否为bcd码
//         
//参数:      BYTE Value[in]
//         
//返回值:    BYTE   TRUE:BCD FALSE:非BCD  
//         
//备注内容:  无
//--------------------------------------------------
BYTE lib_IsBCD( BYTE Value );
//--------------------------------------------------
//功能描述:  判断字节串是否为bcd码
//         
//参数:      BYTE *Buf[in]
//         
//           BYTE Len[in]
//         
//返回值:    BYTE   TRUE:BCD FALSE:非BCD  
//         
//备注内容:  无
//--------------------------------------------------
BYTE lib_IsMultiBcd( BYTE *Buf, BYTE Len );

/////////////////////////////////////////////////////////
//
//功能：十进制转BCD码
//
//输入：int Dec                      待转换的十进制数据
//      int length                   BCD码数据长度
//
//输出：unsigned char *Bcd           转换后的BCD码
//
//返回：0  success
//
//思路：原理同BCD码转十进制
//
//////////////////////////////////////////////////////////
int Dec2BCD( long Dec, unsigned char* Bcd, int length );

/*******************************************************************************
 * 函数名称: uint8_t Bcd2HexChar(uint8_t bcd)
 * 函数功能: char型数据BCD-HEX转换
 * 入口参数: BCD数据
 * 出口参数: HEX数据
 * 注意事项: 无
*******************************************************************************/
uint8_t Bcd2HexChar( uint8_t bcd );
unsigned char DecToBCD( uint8_t Dec );

//////////////////////////////////////////////////////////
//功能：BCD转10进制
//
//输入：const unsigned char *bcd     待转换的BCD码
//      int length                   BCD码数据长度
//
//输出：
//
//返回：unsigned long               当前数据位的权
//
//思路：压缩BCD码一个字符所表示的十进制数据范围为0 ~ 99,进制为100
//      先求每个字符所表示的十进制值，然后乘以权
//////////////////////////////////////////////////////////
unsigned long  BCD2Dec( const unsigned char* bcd, int length );

/*******************************************************************************
 * 函数名称: uint8_t Hex2BcdChar(uint8_t hex)
 * 函数功能: char型数据HEX-BCD转换
 * 入口参数: HEX数据
 * 出口参数: BCD数据
 * 注意事项: 无
*******************************************************************************/
uint8_t Hex2BcdChar( uint8_t hex );

BOOL StringToHexGroupBW(unsigned char *OutHexBuffer, unsigned char *InStrBuffer, unsigned int strLength);
WORD MW(BYTE Hi,BYTE Lo);

DWORD MDW(BYTE HH,BYTE HL,BYTE LH,BYTE LL);
void api_Delay10us(WORD us);
#endif//#ifndef __COMMFUNC_API_H

